#ifndef COLLISION_H
#define COLLISION_H

class AABB;
class BoundingSphere;

#include "aabb.h"
#include "boundingsphere.h"
#include "boundingShape.h"

#include "collisions.h"

#include "Delegate/delegate/delegate.h"
#include "Delegate/slot/slot.h"

class GraphicElement;

/*!
 *  \class Collision
 *  \brief  Objet utilisé pour gérer les collisions entre 2 formes englobantes
 *  \details Détecte une collision entre les 2 éléments et éxécute la méthode de résolution définis
 *
 */

class Collision
{
    public:

    AbstractDelegate * delegate;    /*!< delegué qui contiendra le test de collision, et la méthode de résolution */

    BoundingShape *a;       /*!< Première forme englobante */
    BoundingShape *b;       /*!< Deuxieme forme englobante */

    int end;

    /*!
     *  \brief Constructeur
     *  \details Initialise les deux formes englobantes et la méthode d'initialisation
     *
     *  \param BoundingShape aa 1er forme englobante
     *  \param BoundingShape ab 2eme forme englobante
     */

    Collision(BoundingShape *aa, BoundingShape *bb);

    template <class T,class U, class V>
    void ResolveCollision(int (T::*pSlot)(U,V),T *ref);

    void AddSlot(AbstractSlot *aSlot);
    void Update();

    int Collide();
};

template <class T,class U, class V>
void Collision::ResolveCollision(int (T::*pSlot)(U,V), T *ref)
{
    delegate->Connect(new Slot(pSlot,ref,a,b));
}

#endif // COLLISION_H
